{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Relative cost of matrix operations"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import scipy.linalg as spla\n",
        "import scipy as sp\n",
        "\n",
        "import matplotlib.pyplot as pt\n",
        "\n",
        "from time import time\n",
        "\n",
        "np.alterdot()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "array([  10,   14,   20,   30,   43,   63,   92,  133,  193,  279,  404,\n",
              "        585,  848, 1228, 1778], dtype=int32)"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "n_values = (10**np.linspace(1, 3.25, 15)).astype(np.int32)\n",
        "n_values"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "-----> mat_mul\n",
            "10\n",
            "14\n",
            "20\n",
            "30\n",
            "43\n",
            "63\n",
            "92\n",
            "133\n",
            "193\n",
            "279\n",
            "404\n",
            "585\n",
            "848\n",
            "1228\n",
            "1778\n",
            "-----> lu\n",
            "10\n",
            "14\n",
            "20\n",
            "30\n",
            "43\n",
            "63\n",
            "92\n",
            "133\n",
            "193\n",
            "279\n",
            "404\n",
            "585\n",
            "848\n",
            "1228\n",
            "1778\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "<matplotlib.text.Text at 0x7fe3ac7e7a90>"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZEAAAERCAYAAAC6kZqPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8FfX1//HXISAgIgmCgIAEFBUQCS4sKhpZNPRbi61b\nbV3iSkVQW38VcQMttYJaQRELuKDW5etXC1KrKNtVgSKg7CQIAiIQ9i3sWc7vj5mESwjJTXLnztzk\nPB+P+8iduTN33swN95P5fGbOiKpijDHGlEc1vwMYY4yJX9aIGGOMKTdrRIwxxpSbNSLGGGPKzRoR\nY4wx5WaNiDHGmHLztBERkTQRyRSRlSIysITlLhKRXBG5NmzeWhFZLCILRGSulzmNMcaUT3Wv3lhE\nEoBRQE9gAzBPRCapakYxyw0DJhd5CwVSVXWHVxmNMcZUjJdHIp2AVaq6VlVzgA+APsUsNwD4CNha\nzGviYT5jjDEV5GUj0hT4OWx6vTuvkIg0xWlYXnVnhV8+r8BUEZkvInd7mNMYY0w5edadxdENwvGM\nAB5RVRUR4egjj0tUNUtEGgJTRCRTVb/xJKkxxphy8bIR2QA0D5tujnM0Eu4C4AOn/aAB0FtEclR1\nkqpmAajqVhGZgNM9dlQjIiJW+MsYY8pBVaMyXOBld9Z8oLWIJIvICcCNwKTwBVS1laq2VNWWOOMi\n96rqJBE5UUTqAohIHeBKYElxG1HVQD0GDx7se4Z4yWWZLFNVyBXETNHk2ZGIquaKSH/gCyABeF1V\nM0Skr/v6mBJWbwz8yz1CqQ68q6pfepU1mtauXet3hGIFMZdlioxlilwQcwUxUzR52Z2Fqn4OfF5k\nXrGNh6reHvZ8NZDiZTZjjKkKtmyBpCSoUcOb97cr1qMsPT3d7wjFCmIuyxQZyxS5IObyM1N+Plx3\nHbz/vnfbkGj3j8WSiGg85zfGGC+NHQtvvAGzZkFCwpH5IoLGwcC6b0TEHj49yiIUCnnzC1ABliky\nQcwEwczlV6asLHjsMRg37ugGJNo8HRPxkx2hxF5ZGxFjjHcGDIC+faF9e2+3Uym7s9xDNR8SVW22\n340Jhk8+gYcfhkWLoFatY1+PZndWpT0SMcaYqmjPHujfH/75z+IbkGirlGMiJj5Y/3VkLFPkgpgr\n1pkGDYKrroLLL4/N9uxIxBhjKonZs2HCBFi2LHbbtDERUyZDhgzhxx9/5J133jnmNdvvxvjn8GE4\n/3x48km44YaSl7VTfA3p6ek88cQTMd+unYFlTDANGwYtW8L118d2u9aImDKJ5pGG9V9HxjJFLoi5\nYpEpMxNeeglGj4ZY/51njUiMJScn8/zzz3PeeedRt25d7rzzTjZv3kzv3r2pV68evXr1YteuXQBc\nf/31NGnShMTERC6//HKWL18OwNixY3nvvfcYPnw4devWpU+f4m4YWb5thkIhmjdvfsz606dP92Bv\nGGMqKj8f7rnH6cYq8l83NvwuSVzBcsZanOPNP3qZij/KIzk5Wbt27apbtmzRDRs26KmnnqodO3bU\nhQsX6sGDB7V79+761FNPqarqG2+8oXv37tXDhw/rgw8+qCkpKYXvk56erk888UTUtzljxgxt1qzZ\nMetPmzZNVVUHDx6sN998c7HbiWS/G2Oia8wY1c6dVXNzI1/H/b8ale/hKnt2lp/jvwMGDKBhw4YA\ndOvWjUaNGtGhQwcAfv3rXzNt2jQAbr+9sLAxgwcPZuTIkWRnZ1O3bl2gbF1LkW7TGBM/CkqbTJ/u\nbWmTklh3lg8aNWpU+Lx27dpHTdeqVYu9e/eSn5/PI488wplnnkm9evVo2bIlANu2bfNsm7FWVfuv\ny8oyRS6IubzMFKvSJiWpskciQVLcEcV7773HpEmTmDZtGi1atGDXrl3Ur1+/cNmKniV1vKOYOnXq\nsH///sLpvLw8tm7dWqFtGWOi75NPYMkS58p0P3l6JCIiaSKSKSIrRWRgCctdJCK5InJtWdetrLKz\ns6lZsyb169dn3759PProo0e93qhRI1avXh317Z511lkcPHiQzz77jJycHIYOHcqhQ4eivh2A1NRU\nT963IixTZIKYCYKZy4tMBaVNxo6NTWmTknjWiIhIAjAKSAPaAjeJSJvjLDcMmFzWdSuL8KOKgpLq\nt956Ky1atKBp06ace+65dO3a9ajl7rzzTpYvX05SUhK/+c1vorJNgHr16jF69GjuuusumjVrxkkn\nnXTU2VrlKflujImuWJc2KVG0RuiLPoCuwOSw6UeAR4pZ7kGgH/AmcG0Z1y3pzAMTY2Xd7zNmzPAm\nSAVYpsgEMZNqMHNFO9OsWapNmqju2FH+9yCKZ2d52Z3VFPg5bHq9O6+QiDQF+gCvurMKOupLXdcY\nY6qaQ4fg7rthxAjnvulB4OXAeiTnn47AOcJQcfpICvpJIj53NT09neTkZAASExNJSUkpa864t27d\nOtq1a3fMfBFh+fLlNGvWLGZZQqFQYR9wwVkpx5su6/Kxmg7PFoQ8QZxOTU0NVJ7w6QJByRPN6bff\nhlatUrn++rKtHwqFGD9+PEDh92W0eFaAUUS6AENUNc2dHgTkq+qwsGVWc6ThaADsB+4GtpS2rjtf\ni8tvhQD9YfvdGO9kZkK3bvD99xW/Mj1eCjDOB1qLSLKInADcCEwKX0BVW6lqS1VtCXwE3KuqkyJZ\n18S/qnZOf3lZpsgFMVc0Mvle2qQEnnVnqWquiPQHvgASgNdVNUNE+rqvjynrul5lNcaYIHvtNafU\ne79+fic5lt1PxESN7Xdjoi8rC847zyltEq0r0+OlO8sYY0wFBaG0SUmsEYmx5ORkK3boqqz919Fm\nmSIXxFwVyVRQ2uTxx6OXJ9qsdlaM2RXfxphIFJQ2+ec//S9tUhIbE4mxli1b8vrrr9O9e3e/o0Rd\nkPe7MfHmvvucwfRx46L/3jYmEudU9Zh7pIeKuaOgMaZqmj0bJkyA4cP9TlI6a0R8Yl1ala//2iuW\nKXJBzFXWTEEsbVKSKjsmIk9V/EtcB1vXjTEmuoYNg1at4Prr/U4SmSrbiFgD4L+qcu+HirJMkQti\nrrJkysyEl16CBQsgXjorrDvLJ0XvILhp0yYf0xhj/FZQ2mTw4OCVNimJNSI+SUlJ4bPPPmPnzp1s\n2rSJESNG+B0p5ipD/3UsWKbIBTFXpJmCXNqkJNaI+EBEuOWWW+jQoQPJycmkpaXx29/+1gbbjami\nsrLgscec03kTEvxOUzZ2nYiJGtvvxpTPddfBOefA0KGx2V40rxOpsgPrxhgTBAWlTf75T7+TlI91\nZxnfxHP/dSxZpsgFMVdJmQpKm4wdG+zSJiWxRsQYY3wyaBCkpcHll/udpPxsTMREje13YyI3e7Yz\nFrJsWeyvTI+b2lkikiYimSKyUkQGFvN6HxFZJCILROQ7Eeke9tpaEVnsvjbXy5zGGBNL8VbapCSe\nNSIikgCMAtKAtsBNItKmyGJTVbWDqnYE0oGxYa8pkKqqHVW1k1c5jX/irf/aL5YpckHMVVymeCtt\nUhIvz87qBKxS1bUAIvIB0AcovFe6qu4LW/4kYFuR9yj34ZZdc2GMCaKMjPgrbVISz8ZEROQ64CpV\nvdudvhnorKoDiix3DfA3oAlwparOdeevBnYDecAYVT2mqv7xxkSMMSaI8vOdQfQbbnBue+uXeLlO\nJKJvd1WdCEwUkW7AO8DZ7kuXqGqWiDQEpohIpqp+U3T99PR0kpOTAUhMTCQlJaWw4FnBYaRN27RN\n23QQpv/9b8jJSaVfv9huPxQKMX78eIDC78uoUVVPHkAXYHLY9CBgYCnr/AicUsz8wcBDxczXoJkx\nY4bfEYoVxFyWKTKWKXJBzFWQaeNG1QYNVBcv9jePqqr73RmV73ovz86aD7QWkWQROQG4EZgUvoCI\nnCHu4IWInO+2CttF5EQRqevOrwNcCSzxMKsxxnhqwADo2xfat/c7SXR5ep2IiPQGRgAJwOuq+jcR\n6QugqmNE5GHgViAH2Av8SVXniUgr4F/u21QH3lXVvxXz/uplfmOMiYZPPoGHH4ZFi4JxZXo0x0Qq\n5cWGxhgTFHv2QLt2Tm2soFyZHjcXG1ZFBYNZQRPEXJYpMpYpckHMdeutobgvbVISq+JrjDEemT0b\nvvkGVq3yO4l3rDvLGGM8cOgQnH++c7vbG27wO83RrDvLGGMCrjKVNimJNSJRFsQ+WQhmLssUGcsU\nuaDkKihtMno0fPVVyO84nrJGxBhjoig/H+65x+nGat7c7zTeszERY4yJojFj4M03YdYsSEjwO03x\n7DoRlzUixpgg2bgROnSA6dODfWW6DawHWFD6ZIsKYi7LFBnLFDm/c91//7GlTfzO5DW7TsQYY6Lg\nk09gyRLnyvSqxLqzjDGmgoJY2qQkNibiskbEGBME990Hhw/DuGNunRdMNiYSYEHt/wxiLssUGcsU\nOT9yzZ4NEybA8OHFvx7UfRUt1ogYY0w5HToEd98NI0ZAUpLfafxh3VnGGFNOTz8N8+bBpEkgUekc\nig0bE3FZI2KM8UtGBnTrBgsWxN+V6XEzJiIiaSKSKSIrRWRgMa/3EZFFIrJARL4Tke6RrhtUQe3/\nDGIuyxQZyxS5WOUqS2mToO6raPHsOhERSQBGAT2BDcA8EZmkqhlhi01V1U/c5dsDE4AzI1zXGGN8\nMW4c5ORAv35+J/GfZ91ZItIVGKyqae70IwCq+mwJy7+oql0iXde6s4wxsRYvpU1KEi/dWU2Bn8Om\n17vzjiIi14hIBvA5cH9Z1jXGmFgbMODY0iZVmZdlTyI6RFDVicBEEekGvCMi55RlI+np6SQnJwOQ\nmJhISkoKqampwJG+yFhOL1y4kAcffNC37R9vOrxfNgh5AEaMGOH751V0OoifX8G8oOQJ6u9TLD6/\nmTNh6dJU3n03vj6/UCjE+PHjAQq/L6NGVT15AF2AyWHTg4CBpazzI3BKpOs68YNlxowZfkcoVhBz\nWabIWKbIeZlr927VZs1UQ6GyrRfEfeV+d0blu97LMZHqwAqgB7ARmAvcpGGD4yJyBrBaVVVEzgf+\nT1XPiGRdd331Kr8xxoSLt9ImJYnmmIhn3Vmqmisi/YEvgATgdVXNEJG+7utjgGuBW0UkB9gL/Lak\ndb3KaowxJSkobbJsmd9JgsfT60RU9XNVPVtVz1TVv7nzxrgNCKo6XFXPVdWOqtpNVeeVtG48CO8H\nDZIg5rJMkbFMkfMiV0Fpk5Ejy1faJKj7KlqsdpYxxpRg2DBo1Qquu87vJMFkZU+MMeY44rm0SUli\nNiYiIhdQ+qm6Oaq6JBphjDEmKMpS2qQqK607KwS8UMrj3x7miztB7f8MYi7LFBnLFLlo5opWaZOg\n7qtoKe3srPmqekVJC4jIjCjmMcYY323cCI8/7pQ2SUjwO02w2ZiIMcYUce210KYNDB3qdxJvxLx2\nlohcKiInuc9vEZEXRaRFNAIYY0yQTJwIS5c6RyKmdJGe4vsqsE9EOgB/AlYBb3uWKo4Ftf8ziLks\nU2QsU+QqmmvPHqfA4tixUKtWMDIFXaSNSK7bb3QN8IqqvgLU9S6WMcbE3qBBkJYGl1/ud5L4EdGY\niIh8DUwGbge6AVuBharqazFkGxMxxkTL7NnOBYXLlpXvyvR44sf9RG4EDgJ3qOomnHt7PBeNAMYY\n47eKljapyiJqRFQ1S1X/rqrfuNPrVNXGRIoR1P7PIOayTJGxTJErby4vS5sEdV9FS4mNiIh8Wtob\nRLKMMcYEVUYGvPQSjB4NEpUOnqqlxDEREdkNfF3Ke5yrqi2jmipCNiZijKmI/HxnEP2GG5yzsqqK\nWN5PpE8E73EoGkGMMSbWolXapCorsTtLVUMRPP57vPVFJE1EMkVkpYgMLOb134vIIhFZLCKzROS8\nsNfWuvMXiMjciv0zYyeo/Z9BzGWZImOZIleWXAWlTcaN87a0SVD3VbR4dmdDEUkARgE9gQ3APBGZ\nVOQOhauBy1R1t4ikAWNx7q8OTvXgVFXd4VVGY0zVNWAA9O0L7X29UCH+eXmP9a7AYFVNc6cfAVDV\nZ4+zfBKwRFWbudNrgAtVdXsJ27AxEWNMmU2cCAMHwqJF0bsyPZ74cZ0IInKiiJxdhvduCvwcNr3e\nnXc8dwKfhU0rMFVE5ovI3WXYrjHGHNfu3dC/f3RLm1RlkRZg/BWwAPjCne4oIpNKWS3iQwQRuQK4\nAwgfN7lEVTsCvYH7RKRbpO/np6D2fwYxl2WKjGWKXCS5Bg2C3r1jV9okqPsqWiIdExkCdAZmAKjq\nAhFpVco6G4Dw+4E1xzkaOYo7mD4OSFPVnQXzVTXL/blVRCYAnYBviq6fnp5OcnIyAImJiaSkpJCa\nmgoc+fBiOb1w4UJftx9P0wsXLgxUnqB+fgWCkifI06V9fkuWwMSJqSxbVrU+v1AoxPjx4wEKvy+j\nJdLaWd+qamcRWeAeHSAii1X1vBLWqQ6sAHoAG4G5wE3hA+sicjowHbhZVeeEzT8RSFDVbBGpA3wJ\nPKWqXxbZho2JGGMicugQnH8+DBkC11/vdxp/xfI6kQLLROT3QHURaQ3cD8wuaQVVzRWR/jhdYAnA\n66qaISJ93dfHAE8CScCr4lwqmqOqnYDGwL/cedWBd4s2IMYYUxbDhsEZZ3hT2qQqi3RgfQDQDufC\nwveBPcCDpa2kqp+r6tmqeqaq/s2dN8ZtQFDVu1T1FFXt6D46ufNXq2qK+zi3YN14UPQQNiiCmMsy\nRcYyRe54uQpKm7zySuxLmwR1X0VLREciqroPeNR9GGNM3MjPh3vugcGDoXnz0pc3ZRPpmMhFOA1I\nMkcaHi1pTCQWbEzEGFOaMWPgzTdh1ixvr0yPJ9EcE4m0EfkB+H/AUiC/YL6qro1GiPKyRsQYU5KN\nG6FDB5g+3a5MD+fHxYZbVXWSO1axtuARjQCVTVD7P4OYyzJFxjJFrmiuIJQ2Ceq+ipZIz856SkRe\nB6YCh915qqr/8iaWMcZUzMSJsHQpvPuu30kqt0i7s94FzgaWcXR31u3eRSuddWcZY4qzeze0a+c0\nILG6Mj2e+DEmsgI4J2jf2NaIGGOK06+fc5+QceP8ThJMfoyJzAbaRmODlV1Q+z+DmMsyRcYyRS4U\nCjFrltOVNXy432kcQd1X0RLpmEhXYKFbnr3gToa+n+JrjDHhDh92jkJGjoSkJL/TVA2RdmclFzff\n7zO0rDvLGBPu6adh/nz45JPYX5keT2JWO0tETlbVPThlTowxJrAKSpssWGANSCyVNibyvvvze+C7\nYh6miKD2fwYxl2WKjGUqXUFpk9/9LhS40iZB21fRVuKRiKr+j/szOSZpjDGmHMaNc87G6tPH7yRV\nT6RjItNUtUdp82LNxkSMMVbapOxiOSZSGzgRaCgi9cNeOpmS75dujDExEYTSJlVZaWMifYH5OFer\nh4+FTAJGeRstPgW1/zOIuSxTZCzT8RWUNnn8cWc6KLnCBTFTNJXYiKjqCFVtCfxZVVuGPc5T1VIb\nERFJE5FMEVkpIgOLef33IrJIRBaLyCz3fusRrWuMqdp274b+/WHsWKhVy+80VVdEYyLlemORBJx7\nrPcENgDzOPYe612B5aq6W0TSgCGq2iWSdd31bUzEmCrKSpuUnx/3WC+PTsCqggsSReQDoA9Q2BCo\n6n/Dlv8WaBbpusaYqqugtMmyZX4nMZHWziqPpsDPYdPrKXkw/k7gs3KuGxhB7f8MYi7LFBnLdLRD\nh+Duu4svbWL7KvZKOzvrAuC4/UWq+n0Jq0fczyQiVwB3AJeUdV1jTNXy7LNw5plw3XV+JzFQenfW\nC5T8hX5FCa9tAMKvHW2Oc0RxFHcwfRyQpqo7y7IuQHp6OsnJyQAkJiaSkpJCamoqcOQvgFhPF/Br\n+8VNp6amBipPgVAoFJg8Qf78gjbt1+/TTz/Byy+nsmABfPVV8csXCNL+8ns6FAoxfvx4gMLvy2jx\ncmC9Os7geA9gIzCXYwfWTwemAzer6pyyrOsuZwPrxlQR+fnODaZuuMG5NsSUX8zuJyIi14rIb473\nKGldVc0F+gNfAMuB/1XVDBHpKyJ93cWeBJKAV0VkgYjMLWndCv1LY6ToX0NBEcRclikylslRUNqk\nX7/jL2P7KvZK6866mpK7s0q8x7qqfg58XmTemLDndwF3RbquMaZq2rjRuaBw+nRISPA7jQnnWXdW\nLFh3ljFVw7XXQps2MHSo30kqB1+uExGRX+LcIrfw2lBVfToaIYwx5ngKSpu8+67fSeJPvubzxoI3\nOPfUc+nSrIsn24joOhERGQPcANwPiPu8hSeJ4lxQ+z+DmMsyRaYqZypraZOqvK+K+nb9t3R5rQtv\nLnyTOjXqeLadSI9ELlbV9iKyWFWfEpEXgMmepTLGGGDQIOjd2zkry0Rm897NDJo2iMmrJjOs5zBu\nPu9mxMNbPUZ6P5G5qtpJROYA1wLbgaWqeqZnySJgYyLGVF6zZsH11zulTYpemW6OlZOXw+h5oxn6\nzVBu63AbT17+JCfXPLnYZf0YE/lURJKA5zhyW1wre2aM8URJpU3MsWasmcGAzwdwWt3T+Dr9a9o0\nbBOzbZd2ncgfRaQT8Iyq7lTVj4Fk4BxVfSIWAeNNEPtkIZi5LFNkqmKm8pY2qWr7at3uddzwfzdw\nx6Q7+MsVf+GLm7+IaQMCpR+JNANGAG1EZAkwE5jtPowxJuoyMuDll2HBAvCwKz+uHcw9yPOzn2fE\nnBH079Sft655i9o1avuSJdIxkZrAhUBX4GL35y5VjW2Td2wuGxMxphKx0iYlU1U+/eFTHvziQTo0\n6sDfr/o7yYnJZX4fP8ZEauPcV72e+9gILI5GAGOMKRBJaZOq6oftP/Dg5AdZs2sN//iff9DrjF5+\nRwJKHxMZJyKzgA9wjj5mA9ep6gWqenssAsabIPbJQjBzWabIVJVMBaVNxo0rf2mTyriv9h7eyyNT\nH+Hi1y+me8vuLPrDosA0IFD6kcjpQE1gJU559g3ALq9DGWOqngEDoG9faN/e7yTBoKp8sPQDHp76\nMFckX8GSe5fQpG4Tv2Mdo9QxERGpBrTjyHhIe5zrROao6pOeJyw5m42JGFMJTJwIAwfCokWRXZle\n2S3evJgBnw9gz6E9jOo9iktOv6T0lcogmmMiERdgFJHmOI3IJcAvgVNUtV40QpSXNSLGxL/du6Fd\nO6c2VlW/Mn3ngZ08OeNJPlz+IU+lPsXd599NQrXoly2O5f1EHhCR/xWRdcBXOKXhM4BfA/WjEaCy\nCWKfLAQzl2WKTGXPFM3SJvG6r/Ly8xj33TjavNKGPM1jeb/l/OHCP3jSgERbaWMiycCHwB9VdaP3\ncYwxVcmsWU5X1rJlfifxz5z1c+j/WX9qVa/F57//nI5NOvodqUw8vZ+IiKThXKyYALymqsOKvH4O\n8CbQEXhMVV8Ie20tsAfIA3JUtVMx72/dWcbEqUOHoGNHeOopp0ZWVbNp7yYemfoIU1ZPYXjP4fyu\n/e88LZQYzpf7iZSViCQAo4CeOGd1zRORSUVuc7sdGABcU8xbKJCqqju8ymiM8U95S5vEu5y8HEbN\nHcUzM5/h9pTbybwvk7o16/odq9wiup9IOXUCVqnqWlXNwbnWpE/4Aqq6VVXnAznHeY+4K3oQxD5Z\nCGYuyxSZypipoLTJK69Et7RJ0PfVtNXTSBmTwuQfJzPz9pkM7zU8rhsQ8PBIBGgK/Bw2vR7oXIb1\nFZgqInnAGFW1qsHGVAL5+U6F3iFDoHlzv9PExk+7fuKhLx/iu6zvePGqF+lzdp+YdV15zctGpKKD\nFZeoapaINASmiEimqn5TdKH09HSSk5MBSExMJCUlhdTUVODIXwCxni7g1/aLm05NTQ1UngKhUCgw\neYL8+QVtuiK/T5mZqeTmQps2IUKhyv35Hc47zLfVv+W6sddx9QlX849z/8FV51wV8zyhUIjx48cD\nFH5fRotnA+si0gUYoqpp7vQgIL/o4Lr72mBgb/jAeiSv28C6MfFl40bo0AGmT6/cV6arKpNWTOKP\nX/yR85uczwtXvkCLxODcUTxm14lU0HygtYgki8gJwI3ApOMse9Q/RkROFJG67vM6wJXAEg+zRk3R\nv4aCIoi5LFNkKlMmr0ubBGFfrdi2gt7v9mbQtEGMvXos/U/tH6gGJNo8685S1VwR6Q98gXOK7+uq\nmiEifd3Xx4hIY2AeToXgfBF5AGgLnAr8y+0zrA68q6pfepXVGOO9iRNh6VLnyvTKKPtQNkO/Hsob\nC99g0KWDGNBpADUSahBaF/I7mqc8vU7Ea9adZUx8qMylTVSV95a8x8CpA+nZqifP9nyWxic19jtW\niXypnRVE1ogYEx/69XPuEzKukp1juXDTQgZ8PoD9OfsZ1XsUXZt39TtSROJlTKRKCkKfbHGCmMsy\nRSbeMxWUNhk+3Ls8BWK1r3Yc2MF9/7mPq/55Fbecdwtz75p73AYkiJ9fNFkjYozxzKFDzjUhI0dC\nUpLfaSouLz+PMfPH0OYV587gGfdlcM8F98RFoUSvWHeWMcYzTz0F330Hn3wS3SvT/TD759kM+HwA\nJ9Y4kVG9R9GhcQe/I5WbjYm4rBExJrgyMqBbN1iwIL6vTN+0dxMDpw5k2uppDO81nJvOvSnurza3\nMZEAC2r/ZxBzWabIxGMmv0qbRHNf5eTl8MLsFzh39Lk0OakJGfdllKvSbhA/v2jysuyJMaaKGjsW\ncnPh3nv9TlI+U36cwv2T7yc5MZlZd8zi7AZn+x0psKw7yxgTVRs2QEpKfJY2WbtrLQ99+RALNy3k\nxate5Oqzro77rqviWHeWMSaw7r/f29ImXjiQc4CnQk9x4dgL6di4I8v6LeNXZ/+qUjYg0WaNSJQF\ntf8ziLksU2TiKVNBaZPHH49tngJl3VeqyoSMCbQd3ZalW5fyfd/vefyyx6lVvZZvmeKNjYkYY6Ji\n927o398pbVIret/BnsnclskDkx9g/Z71vHb1a/Ro1cPvSHHJxkSMMRWWm+t0YVWrFvzSJtmHsnn6\nq6cZv2g8j176KP079adGQg2/Y8WUjYkYYwIhPx/+7//g3HPhxx9jU9qkvFSVfy7+J+e8cg7bDmxj\n6b1L+WMbrMMpAAAafUlEQVTXP1a5BiTarBGJsqD2fwYxl2WKTBAzzZgR4vPP4cILYdgweOklmDHD\n/9Imx9tXC7IW0O3Nboz8diQf3/Axb/Z5k0YnNfI1U2VhYyLGmDL55hvnDKy8PBg6FH796+CWNNm+\nfzuPT3+cCZkTGNp9KHd0vINqYn87R5ONiRhjIvL99/DYY5CZ6dTE+v3vISGgdQfz8vMY9/04BocG\nc0PbG3j6iqdJql0JKkBGSdyMiYhImohkishKERlYzOvniMh/ReSgiDxUlnWNMbGRkQHXXw+//CVc\nfTWsWAG33hrcBmTWullcNO4i3l/6PlNumcLLv3jZGhAPedaIiEgCMApIw7nl7U0i0qbIYtuBAcDz\n5Vg3kILa/xnEXJYpMn5l+uknuP12506EF10Eq1Y5N5c64YRg7qes7Cx6/aUXN350I3+++M+Ebgtx\nXqPz/I4VyH0VTV4eiXQCVqnqWlXNAT4A+oQvoKpbVXU+kFPWdY0x3ti0yRnzOP98p3jiDz/Aww/D\niSf6nax4h/MO89ys52j/ansantiQzP6Z3NQ+/ivtxgvPxkRE5DrgKlW9252+GeisqgOKWXYwsFdV\nXyjLujYmYkz07NwJzz0HY8Y43VWDBsGpp/qdqmRf/vgl939+P62SWjEybSStT2ntd6S4EM0xES/P\nzqrIt3vE66anp5OcnAxAYmIiKSkppKamAkcOI23apm36+NMXXpjKSy/BsGEhLr0UFixI5fTTndeX\nL/c/X3HTa3au4ZYXb2H1ztWM6T+GX571S7766is2sCEQ+YI2HQqFGD9+PEDh92XUqKonD6ALMDls\nehAw8DjLDgYeKuu6TvxgmTFjht8RihXEXJYpMl5lOnhQdeRI1caNVX/7W9UVK/zPVJr9h/fr4BmD\n9ZRhp+jQr4bqgZwDgchVkiBmcr87o/Jd7+WRyHygtYgkAxuBG4GbjrNs0cOqsqxrjCmD3Fx4+23n\nNN3zzoPPP3dKtweZqjIhcwJ/+uJPdG7WmQV9F9C8XhzfLrES8fQ6ERHpDYwAEoDXVfVvItIXQFXH\niEhjYB5wMpAPZANtVXVvcesW8/7qZX5jKpP8fPj4Y3jiCWjcGJ55Bi6+2O9UpcvYmsH9k+8nKzuL\nl3u/zBUtr/A7Utyze6y7rBExpnSqMHmyc6FgQoLTePTsGdyrzAvsObSHp796mrcWvcXj3R6n30X9\nrM5VlMTNxYZVUcFgVtAEMZdlikxFMn3zDVx2GTz0kHOPj7lzoVevijcgXu6nfM3n7UVvc86oc9h5\nYCfL+i3jgS4PRNSAVLbPLx5Y7SxjKqHvvnMajXgoURLu+6zv6f9Zf3Lzc5lw4wQ6N+vsdyRTCuvO\nMqYSyciAJ5+EWbOcRuSuu5wrzINu+/7tPDb9MSZmTuSv3f/K7R1vt0KJHrLuLGPMUdauPX6JkiDL\ny89j9LzRtHmlDTUTapLZP5M7z7/TGpA4Yp9UlAW1/zOIuSxTZErKtGkTDBgAF1zglChZuTI2JUqi\nsZ9mrpvJBWMv4MNlHzLt1mmM7D2SxFqJvueKtiBmiiYbEzEmDu3c6dxFcOxYuO02pxsr6CVKCmzM\n3sjDUx7mq5++4vlez3NDuxuszlUcszERY+LI3r3OXQRffNG5GdQTTzhHIPHgcN5hRswZwfBZw+l7\nQV8e7fYodU6o43esKileamcZY6Lk0CGnMOLf/gapqTB7NrSOo1qDk1dN5oHJD9C6fmvm3DWHM+uf\n6XckEyU2JhJlQe3/DGIuy1S63Fx4+OEQZ50FU6Y4Fw2+/77/DUik+2n1ztVc88E19P+sP3+/8u98\n+rtPPW1Agvb5QTAzRZMdiRgTQPn58NFHTndV7dpOwxEPJUoK7M/Zz7Mzn2X0vNH8qeuf+OC6D6hV\nvZbfsYwHbEzEmABRdQoiPvYYVK8ePyVKCqgqH2d8zENfPkTXZl15rtdzVigxgGxMxJhK6Ouv4dFH\nnTOvhg6Fa66Jn8YDYOmWpTw4+UE279vMW9e8RWpyqt+RTAzYmEiUBbX/M4i5LJPju+8gLQ3S06Fv\nX1i82DnzqqABCep+2r5/Ox8t/4h7P72X1i+3psfbPehzdh8W9F3gWwMS1H1VmdmRiDE+KShRMnu2\nU6LkzjuDfYX5vsP7mLluJlNXT2Xi5IlsmbOFS0+/lB4te/CHC/9A+0bt7UrzKsjGRIyJsbVrnaKI\n//kP/PnPcN993l9hXh45eTnM3TCXaWumMW3NNL7b+B3nNzmfHi170LNVTzo17WSl2eOUjYkYE4c2\nbYK//hXeew/693dKlNSr53eqI/I1n6VbljJttdNofLPuG1oltaJny54MunQQ3U7vZhcHmmN4euwp\nImkikikiK0Vk4HGWecl9fZGIdAybv1ZEFovIAhGZ62XOaApq/2cQc1WVTDt2wKBB0K4d1KhxpDx7\npA2Il/tpzc41vPb9a/z2o9/S+PnGXPvhtazYvoLbOtzGj/f/yIK+C3juyudIOzPtqAYkiJ8dBDNX\nEDNFk2dHIiKSAIwCegIbgHkiMklVM8KW+QVwpqq2FpHOwKtAF/dlBVJVdYdXGY3x0t69MHKkU6Lk\nN7+BhQv9L1GyZd8Wpq+ZXni0sT9nPz1a9eDKM65kWM9htEhs4W9AE3c8GxMRka7AYFVNc6cfAVDV\nZ8OW+QcwQ1X/153OBC5X1c0isga4UFW3l7ANGxMxgRNeouSKK5yjDr+uMM8+lM3XP31dOK7x066f\nuKzFZfRs1ZMeLXvQtmFbK35YBcXLmEhT4Oew6fVA0duUFbdMU2AzzpHIVBHJA8ao6jgPsxpTYbm5\n8PbbTqPRoYNToqRDh9hmOJx3mDnr5zBt9TSmrpnKok2LuKjpRfRs2ZMxvxzDhaddSPVqNhRqosfL\n36ZIDxGO1xpeqqobRaQhMEVEMlX1m6ILpaenk5ycDEBiYiIpKSmkpqYCR/oiYzm9cOFCHnzwQd+2\nf7zp8H7ZIOQBGDFihO+fV9Hp8nx+l12WykcfwUMPhTjlFPjgg1S6dnVeD4Uqnq9gXnGv52s+Seck\nMW3NND78z4cs3bKUdp3a0aNlD35d89c80ekJ0nqmFS4/c9XMSvv7FNT/fwXz/P7/P378eIDC78uo\nUVVPHjhjG5PDpgcBA4ss8w/gt2HTmUCjYt5rMPBQMfM1aGbMmOF3hGIFMVe8Z8rPV/3Pf1RTUlQv\nukh1yhRnnpeZ8vPz9YdtP+ir817V6z68Tk8Zdoqe/fLZ2u/Tfvrx8o91+/7t0Q9QSqYgCWKuIGZy\nvzuj8l3v5ZhIdWAF0APYCMwFbtJjB9b7q+ovRKQLMEJVu4jIiUCCqmaLSB3gS+ApVf2yyDbUq/zG\nlCS8RMlf/wp9+nhXomTT3k2FA+HT1kwjNz+38FqN7i270+zkZt5s2FRacTEmoqq5ItIf+AJIAF5X\n1QwR6eu+PkZVPxORX4jIKmAfcLu7emPgX+6AX3Xg3aINiDGxdugQfPMNPP88/PCDM/bxu99BQkJ0\nt7P74G6++umrwnGNjdkbuSL5Cnq07MHDlzzM2aecbYPhJjDsivUoC4VChX2SQRLEXEHPpApLlzr3\n8ZgyBWbOhLZtnRpX0SxRcjD3IP/9+b9MXT2VaWumsWzrMro060KPlj3o0bIHe1bsoUf3HtHZWJQE\n8bODYOYKYqa4OBIxJh5t3w7vvOM0GlOnQq1acOWVcNddzpXmSUkV30Zefh7fZ31f2D01Z/0c2jV0\nBsOf6fEMFze/+Kh7b4RWhiq+UWM8Ykcipkrbv98Z3yg42vj5Z+jeHXr1ch5nnFHxbagqK7avKBzX\nCK0N0aRuE3q27EmPVj24vMXl1KsVoPonptKL5pGINSKmSsnPhwULjjQac+dCx45HGo0LL3RuBlVR\nG/ZsYNqaaYVdVAmSUHiBX/eW3WlSt0nFN2JMOVkj4gpiIxLE/k8IZq5YZVq37kijMW0anHKK00XV\nqxekpkLduhXPtPPATkJrQ4WNxrb927ii5RWF4xpn1j+z3IPhVfmzK6sg5gpiJhsTMaYE2dkQCsGX\nXzoNx/btzi1mr7wSnnsuOvWrDuQcYOa6mYXjGiu2reDi5hfTs1VP3j//fTo07mD31jBVgh2JmLiX\nmwvz5x9pNBYuhM6dj3RRpaRAtQp8nx/MPcgP239g2ZZlLNu6jNk/z2buhrl0aNyhcFyjS7MunJAQ\n4DtKGRPGurNc1ohUXT/+eKTRmDHDOboo6KLq1q18N3k6kHOAFdtXsGzLMpZvXc7ybctZtmUZP+/5\nmVZJrWjbsC3tGrbjotMu4rIWl1G3Zt3S39SYALJGxBXERiSI/Z8QzFxlybRzJ0yffqThOHDgSKPR\nsyc0bhz5dvfn7CdzWybLtzqNxPJty1m+dTnr96yn8bbGdLqkE+0atqNtw7a0bdiW1vVb+3oHv3j/\n7GIpiLmCmMnGREyld/gwzJnjNBhffuncj/ySS5yGY8AA5wZPpY1T7z28t9jGIis7i9antC48srit\nw220bdiWM5LOYNY3swL3H96YILMjERMIqs4d/wrOovr6a+ceHAVHGxdfDDVrFr9u9qFsMrZlHNNY\nbN67mbMbnO0cUTRoS7tTnaOLVkmtrBy6qdKsO8tljUh827rVuSq8oOGoVu1Io9G9OzRocPTyew7t\nccYqijQW2/Zv4+xTznYaibDGomViSxKqRbmwlTGVgDUiriA2IkHs/4Rg5Nq790gX1ZQp8MMPIXr0\nSC1sOFq3drqodh3cVdhYLN+6nGVbnYHunQd2ck6Dcwobi7YNnQajRb0WUWssgrCfirJMkQtiriBm\nsjERE1h798KqVbBy5ZGfBc9373ZOt+3VC15+GbbsyqZh+5ks37qc0auXs+xbp7HYc2gPbRq0KRyz\n6NGyB+1Obcfp9U63ay+MCRg7EjFlVtBQFNdY7N7t1Jtq3RpOP3MvDVpmUbdJFjXqZ3GoRhZrdq0u\nPLLYd3hf4RlQ4WdDNa/X3BoLYzxk3Vkua0S8s29f8Y3EylXKroM7aNYmi1NbZVGveRa1G2QhJ2/i\n8AlZ7M7LImuv88jLz6NJ3SY0OalJ4c/kxOTCBqPZyc3svhjG+CBuGhERSQNG4NyU6jVVHVbMMi8B\nvYH9QLqqLijDuqqqLN+6nKZ1mwaiEmoQ+z+h+Fz79jkX7a1cCSt+yGPpmi1kbshi7fYs9pJFYvMs\nTmqcRUJiFnm1s9hXLYtdOZuoXaP2MY3DUc/dnyfXPLnERiKI+8oyRSaImSCYuYKYKS7GREQkARgF\n9AQ2APNEZFIxt8c9U1Vbi0hn4FWgSyTrFlBVrvngGs6sfyaf/u5T37tBFi5cGIhfmLw82LItl7Wb\ndrFm8w7efWsCr8/ewY9bsli/O4vtB7M4WCOLE+pnoSdlkVN9O3Wa1+fUs5pwXmJjkhs04bS6TWhy\nUhua1O1+VONQu0btqGQMyr4KZ5kiE8RMEMxcQcwUTV4OrHcCVqnqWgAR+QDoA4Q3BL8C3gJQ1W9F\nJFFEGgMtI1gXgMWbF5OTn0P24Wwen/44z/R4xsN/Uul27doV1fdTVXbs3cvqrB38tGUn67buIGvn\nTjbt2cHW7B3sOLCTXYd2kJ27k/26g0Oyk5zqO8g/YSecsJdqOfU4Ia8+uvYAzVqt5bTTmtC9QxPO\nadaZNs2b0PRkp2E4tc6pMb8qO9r7KhosU2SCmAmCmSuImaLJy0akKfBz2PR6oHMEyzQFTotgXQAW\nbV7Eze1v5v7O93PJG5fQ5KQmDOg8oNRwqk53zv79zt3rateGGqV8h+blwZ7sfLbvymHXnlx27c5l\nV3YOu7Nz2Z2dy76Dh5n+7Vb2v/g9h/MPcTj/IIfzD5KTf5DDGvaz8HGI3LDpA3l7yc7dwb78nRyU\nHeQk7HQag7yaVDucRI3c+tTSJE6U+tStkURizfqcclISbZok0+jkJE6rX5/mDZJIblSfFqcmUb9O\nvcIjsyFDhjBkyJBS94sxxpSFl41IpIMtFeqXq7XiVuaMg+9qwGknfMmfsy7lkQkvI1oD0QTn7dXZ\nTJ7mkZefSy455GsuJOQgCbmAUjA2JNUURBFxfkI+KrlotRyolutsNL8GotWpptURqpNADRLE+Xlw\nww4yts+mOrWch9QKe16TGtSihjjza0gtTqyWyAnu8zo16tCoXhJN69enWYMkkk+tT6vTkmiQdEKp\nJT5Ks3bt2oq9gQcsU2QsU+SCmCuImaLJs4F1EekCDFHVNHd6EJAfPkAuIv8AQqr6gTudCVyO051V\n4rrufDs1yxhjyiHwA+vAfKC1iCQDG4EbgZuKLDMJ6A984DY6u1R1s4hsj2DdqO0EY4wx5eNZI6Kq\nuSLSH/gC5zTd11U1Q0T6uq+PUdXPROQXIrIK2AfcXtK6XmU1xhhTPnF9saExxhh/xW1tCRFJE5FM\nEVkpIgNjuN3mIjJDRJaJyFIRud+dX19EpojIDyLypYgkhq0zyM2ZKSJXepgtQUQWiMi/g5DJPWX7\nIxHJEJHlItI5AJkGuZ/dEhF5T0RqxjqTiLwhIptFZEnYvDJnEJEL3H/HShEZ6VGu59zPb5GI/EtE\n6oW95nmu4jKFvfaQiOSLSP0gZBKRAe6+Wioi4WO/vmQSkU4iMtf9TpgnIhd5kklV4+6B08W1CkgG\nagALgTYx2nZjIMV9fhKwAmgDDAceducPBJ51n7d189Vw864CqnmU7U/Au8Akd9rXTDjXAN3hPq8O\n1PMzk/u+q4Ga7vT/ArfFOhPQDegILAmbV5YMBT0Ic4FO7vPPgDQPcvUq+DcDz8Y6V3GZ3PnNgcnA\nGqC+35mAK4ApQA13umEAMoWAq9znvYEZXmSK1yORwgsZVTUHKLgY0XOquklVF7rP9+JcANmUsAsn\n3Z/XuM/7AO+rao46F0+ucvNHlYg0A34BvMaR06Z9y+T+xdpNVd8AZ5xLVXf7mQnYA+QAJ4pIdeBE\nnBM3YppJVb8BdhaZXZYMnUWkCVBXVee6y70dtk7UcqnqFFXNdye/BZrFMtdx9hXA34GHi8zzM9O9\nwN/c7yNUdWsAMmXh/OEGkIhT/SPqmeK1ETneRYoxJc7ZYx1x/nM1UtXN7kubgUbu89PcfAW8yvoi\n8GcgP2yen5laAltF5E0R+V5ExolIHT8zqeoO4AVgHU7jsUtVp/iZKUxZMxSdv8HDbAXuwPnr1Ndc\nItIHWK+qi4u85Oe+ag1cJiJzRCQkIhcGINMjwAsisg54DhjkRaZ4bUR8PxtARE4CPgYeUNXs8NfU\nORYsKWNU84vIL4Et6hSvLPa051hnwum+Oh8Yrarn45x994ifmUTkDOBBnEP404CTRORmPzMVu4HS\nM8SciDwGHFbV93zOcSLwKDA4fLZPccJVB5JUtQvOH3Mf+pwH4HXgflU9Hfgj8IYXG4nXRmQDTp9o\ngeYc3YJ6SkRq4DQg76jqRHf2ZnHqfuEeFm45TtZmHDmsjJaLgV+JyBrgfaC7iLzjc6b1OH8tznOn\nP8JpVDb5mOlCYLaqblfVXOBfQFefMxUoy2e13p3frMh8T7KJSDpOV+nvw2b7lesMnD8CFrm/782A\n70SkkY+ZcLfzLwD3dz5fRBr4nKmTqk5wn3/Eka7Y6GYq70COnw+cVv9HnF+mE4jtwLrg9BW+WGT+\ncGCg+/wRjh2APAGni+dH3EEsj/JdDvw7CJmAr4Gz3OdD3Dy+ZQI6AEuB2u7n+BZwnx+Z3N/dogPr\nZcqA043a2f23VHhg/Ti50oBlQIMiy8UsV9FMRV4rbmA95pmAvsBT7vOzgHUByPQ9cLn7vAcwz4tM\nUf3SiOUD52yDFTiDQoNiuN1LccYdFgIL3EcaUB+YCvwAfAkkhq3zqJszE/dsCQ/zXc6Rs7N8zYTz\npT0PWITzV1q9AGR6GOdLcQlOI1Ij1plwjhY3AodxxvZuL08G4AL337EKeMmDXHcAK4Gfwn7XR8cy\nV1imQwX7qsjrq3EbET8zub9H77jb+A5I9SlT+O/UhTiNwkLgv0BHLzLZxYbGGGPKLV7HRIwxxgSA\nNSLGGGPKzRoRY4wx5WaNiDHGmHKzRsQYY0y5WSNijDGm3KwRMcYYU27WiBhjjCk3a0RMpebetOid\nsOnqIrJV3Bt3HWedeiJybynvOysK2Sr8Hsb4zRoRU9ntA9qJSC13uhdOsbmSSjUkAf2Ke0FcqnpJ\nRYNF4z2M8Zs1IqYq+Az4H/f5TTh1hgRARCaKyHz3lqZ3u8s8C5zh3lZ0mIi0EJEVIvIWsBhoLiJ7\n3fUvcm8dW1NE6rjv0zZ84+78/4jIQvfWo9e78wve4w/uthaIyBoRme7Ov1lEvnXn/0NE7P+rCRyr\nnWUqNRHJximV/yRwMzAH554i/09VrxaRJFXdKSK1cW4NehlwMvCpqrZ33yMZp9JpV3Xv+iYi2apa\n133+F6AWTnXgn1V1WFgERORanCJ397jTdVU1O/w93PnVgenAMJzCgsOAX6tqnoiMBv6rqu8Uee9u\nwLXAV+6sdqo6tMI7zpgIVfc7gDFeU9UlbkNwE/CfIi8/ICIFtwBthnOHui0c6yc9ctvQop4G5gMH\ngAHFvL4YeF5EnsVpnGYe531eAqap6n9EpD9ORdX5IgJOA7WpuH+e+3O9qs5z7/pnTMxYI2KqiknA\n8zil8hsCiMjlOPdZ6KKqB0VkBs4RRXH2lfDeDYA6QALOl/3+8BdVdaWIdMTpUhsqItNU9S/hy7g3\nfmququFjMW+p6qMl/aNUdaaIDHQbkHo4DZkxMWN9rKaqeAMYoqrLwubVA3a6Dcg5QBd3fjZQt+gb\nlGAM8DjwHk4X1FHcOxUeVNV3cRqyjkVevwB4CLglbPY04DoRKWjw6ovI6cW8d23goDvZG/hMRGzA\n3sSMHYmYyk4BVHUDMCpsngKTgT+IyHKcG5z91112u4jMEpElOIPyozn2bC7nNpcitwKHVPUDd+B7\ntoikqmoobNn2wHMikg/kAH8Ifw+gP84ZYTPcrqt5qnqPiDwOfOm+bw7OGWPriuRox5HxkL1AC5y7\nNxoTEzawbowxptysO8sYY0y5WSNijDGm3KwRMcYYU27WiBhjjCk3a0SMMcaUmzUixhhjys0aEWOM\nMeVmjYgxxphy+/89vzvXeFIwoAAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7fe3ac858a90>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "\n",
        "def mat_mul(A):\n",
        "    return A.dot(A)\n",
        "\n",
        "for name, f in [\n",
        "        (\"mat_mul\", mat_mul),\n",
        "        (\"lu\", spla.lu_factor),\n",
        "        ]:\n",
        "\n",
        "    times = []\n",
        "    print(\"----->\", name)\n",
        "    \n",
        "    for n in n_values:\n",
        "        print(n)\n",
        "\n",
        "        A = np.random.randn(n, n)\n",
        "        \n",
        "        start_time = time()\n",
        "        f(A)\n",
        "        times.append(time() - start_time)\n",
        "        \n",
        "    pt.plot(n_values, times, label=name)\n",
        "\n",
        "pt.grid()\n",
        "pt.legend(loc=\"best\")\n",
        "pt.xlabel(\"Matrix size $n$\")\n",
        "pt.ylabel(\"Wall time [s]\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "* The faster algorithms make the slower ones look bad. But... it's all relative.\n",
        "* Is there a better way of plotting this?\n",
        "* Can we see the asymptotic cost ($O(n^3)$) of these algorithms from the plot?"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {},
  "nbformat": 4,
  "nbformat_minor": 0
}